渲染流程

本文详细介绍了GPU的渲染过程,从数据加载到显存,设置渲染状态,调用DrawCall绘制Mesh,再到几何阶段的MVP变换,以及光栅化阶段。重点讨论了DrawCallBatching技术,其目的是减少DrawCall以提高性能,但同时也存在内存和计算时间的增加问题。对于移动设备,减少DrawCall尤为重要。此外,还提及了背面剔除、遮挡剔除等优化策略。
摘要由CSDN通过智能技术生成
cpu阶段
  1. 数据从内存加载到显存:

    • 模型:Mesh、Shader、材质等
    • 摄像机:位置、视锥体、朝向
    • 光源:位置、类型参数等
  2. 设置渲染状态:

    • 即场景中的网格如何被渲染,包括使用哪个顶点着色器、片源着色器、材质、光源属性等
    • 对于渲染状态相同的网格,会一起渲染;对于状态不同的网格,会再次设置新的渲染状态
  3. 调用DrawCall,绘制Mesh:

    • 设置渲染状态,相同的网格一起渲染,再次设置新渲染状态,符合的再次进行渲染,依次类推
    • renderstate drawA drawB renderstate drawC renderstate drawD ...
    • Unity中,每次引擎准备数据通知GPU的过程就是一次DrawCall,这一个过程是逐个物体进行的
    • DrawCall Batching:主要目标就是一次DrawCall处理多个物体,而不是一个。核心在于会检查所有要绘制的物体的材质,将相同材质的分为一组(一个Batch),然后将他们组合成一个物体(统一变换)
    • DrawCall Batching缺点:
      • 相当于组合创建了一个超大物体,相应的需要分配更大内存和apu计算时间
      • 对于静止物体组合一次就可以一直使用,对于运动物体,每一帧都得重新组合,反而更消耗性能
    • 现代cpu中,一味减少drawcall并不一定可以让帧数变高,移动设备才更需要注意
gpu阶段
  1. 几何阶段:MVP变换
    1. M变换:模型变换,模型坐标转变为世界空间坐标
    2. V变换:视图变换,世界空间坐标转变为视图空间坐标(视图坐标,即相机标准位置0,看向Z方向,向上方向为Y轴)
    3. 顶点着色器Shader:输入变换矩阵、顶点属性等
    4. P变换:投影变换(裁剪变换),正交投影或者透视投影,视图空间坐标转变为齐次裁剪空间,也就hi转变为相对于视锥体中心的坐标,方便进行裁剪
    5. 裁剪:视锥剔除、视口裁剪,将不在视口中物体丢弃,部分在的物体进行多边形裁剪生成新的多边形
      • 视锥剔除:在cpu阶段运行,通过AABB盒、OBB盒与视锥体进行碰撞检测,剔除完全不可见的物体,精度较低
      • 视口裁剪:将视口之外的物体丢弃,部分在内部的物体进行裁剪,生成多边形,也就是裁剪生成新的顶点再次渲染
      • 背面剔除:在顶点着色器和片元着色器之间运行,根据图片朝向相机进行判断是否需要剔除
      • 遮挡剔除:主要用于静态物体多的场景
    6. 屏幕映射:三维空间坐标转变为屏幕坐标(齐次裁剪坐标映射到屏幕坐标)
    7. 三角形设置:屏幕坐标顶点生成对应三角形
  2. 光栅化阶段:
    1. 光栅化处理:采样成像素,计算三角形网格内的覆盖的像素点
    2. 片元着色器:(像素着色器)逐像素进行着色(将三角形按照重心,插值的方式将颜色、位置、法线等等赋给像素点)
    3. 将像素的结果写入颜色缓冲区
    4. 帧缓冲器:显卡中硬件实现,用于存放最终渲染结果,为了避免我们看到正在光栅化的图形,GPU一般使用双重缓冲,一个用于前面显示,另一个用于后面渲染,这样保证图像时连续的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值